import { success, fail } from "../utils/base";
import { getBDCConfig } from "../utils/lokijs-db-server";

let logMax = 4000;

// 配置信息可以优化一下
export default defineEventHandler(async (event) => {
  // 获取请求参数
  const body = await readBody(event);
  // console.log("获取请求参数：", body);
  // 1. 获取配置路径
  const { configData, configPath } = getBDCConfig();

  // 2.1 拦截
  const db = event.context.db;
  if (!db) {
    return fail("数据库实例不存在! ❌");
  } else if (!configData.isEnable) {
    return success({ msg: "未开启日志上报功能" });
  }

  /******** end 谷歌事件埋点 end ********/
  if (body.data && body.data.actionType == "EVENT") {
    if (!body.data.eventKey) fail("eventKey参数 不存在");
    let analyticsCol = db.getCollection("analyticsEvent"); // 获取或创建名为 'watchErrLog' 的集合; 用于保存错误监控日志
    if (analyticsCol === null) {
      analyticsCol = db.addCollection("analyticsEvent");
    }
    const eventInfo = JSON.parse(JSON.stringify(body.data));
    delete eventInfo.cusData;

    // 查找 指定数据
    const eventOne = analyticsCol.findOne({ eventKey: body.data.eventKey });
    if (eventOne) {
      if (!eventOne.trackTimeList) {
        eventOne.trackTimeList = [eventOne.trackTime];
      }
      // 添加上报，时间点
      eventOne.trackTimeList.push(eventInfo.trackTime);
      // 更新自定义信息参数
      eventOne.params = eventInfo.params;
      // 更新集合中的 Bob 的数据
      analyticsCol.update(eventOne);
      return success("更新事件，成功");
    }
    // 新增事件
    else {
      analyticsCol.insert({
        trackTimeStr: formatDate(new Date(body.data.trackTime) || Date.now()), // 创建事件
        trackTimeList: [body.data.trackTime],
        ...eventInfo,
      });
      return success("创建事件，成功");
    }
  }

  // 3. 创建/获取集合
  let puvData = db.getCollection("pagePuv");
  if (puvData === null) {
    puvData = db.addCollection("pagePuv");
  }

  let user = db.getCollection("userTable");
  if (user === null) {
    user = db.addCollection("userTable");
  }

  // 3.1 持久化
  const saveDatabase = async () => {
    return new Promise((resolve, reject) => {
      db.saveDatabase((err: any) => {
        if (err) {
          console.log("track-report 数据同步 失败:", err);
          reject(false);
        } else {
          resolve(true);
        }
      });
    });
  };

  // 数据源拷贝,避免引用
  const pageObj = JSON.parse(JSON.stringify({ ...body }));
  const userObj = JSON.parse(JSON.stringify({ ...body.data.cusData }));

  // 4. 用户信息存储
  delete userObj.from;
  delete userObj.to;
  delete userObj.avatar;
  delete userObj.mobile;
  // 4.1 添加记录
  if (userObj && userObj != "undefined" && typeof userObj == "object") {
    try {
      // console.log("页面 用户信息 保存: 00000");
      // 4.1 存在就不保存了
      if (user.data.length > 0) {
        const hasID = user.data.findIndex((e: any) => e.id == userObj.id);
        console.log("user.data:", user.data);
        console.log("hasID:", hasID);
        if (hasID < 0) {
          // 4.2 插入数组
          user.insert(userObj);
          // 4.3 将更新后的数据持久化
          // await saveDatabase();
        }
      }
    } catch (error) {
      console.log("fileExistCall user error:", error);
      return fail({ msg: "用户信息,添加失败", error });
    }
  }

  // 5. 页面 puv 保存
  if (pageObj && pageObj != "undefined" && typeof pageObj == "object") {
    // console.log("页面 puv 保存:", "0000");
    // 5.1 防止数据过大 上限 logMax 条  超过这删除最老的 第 一条
    if (puvData.data.length > logMax) {
      puvData.data.shift();
    }
    // 5.2 添加记录
    try {
      delete pageObj.record;
      delete pageObj.deviceInfo;
      const originalData = JSON.parse(
        JSON.stringify({ ...pageObj.data.cusData })
      );

      delete originalData.avatar;
      delete originalData.mobile;
      pageObj.data.cusData = originalData;
      pageObj.expiresAt = Date.now() + 60 * 24 * 60 * 60 * 1000; // 设置过期时间 60 天
      puvData.insert(pageObj);

      // console.log("puvData.data: 数据库是否脏", db.autosaveDirty());

      // 5.3 将更新后的数据持久化
      // await saveDatabase();
      return success("添加成功");
    } catch (error) {
      console.error("页面 puv 保存 error", error);

      return fail({ msg: "添加失败", error });
    }
  } else {
    return fail("添加失败");
  }
});
